import ast
import logging
from 程序核心代码.mvvm重构.基础定义.基础图形项.节点图形项.带组件带布局的节点图形项 import 带组件带布局的节点图形项
from 程序核心代码.mvvm重构.基础定义.基础模型.ast节点模型基类 import ast节点基础模型
from 程序核心代码.mvvm重构.基础定义.节点管理器.自动节点注册表 import 注册节点模型, 节点模型匹配器, 注册节点图形项

logging.basicConfig(level=logging.WARNING, format='%(asctime)s - %(levelname)s - %(message)s')
日志记录器 = logging.getLogger(__name__)

@注册节点模型(ast.Try)
class Try异常处理节点模型(ast节点基础模型):
    """
    Try异常处理节点模型，用于表示Python中的try-except-else-finally语句
    例如：
    try:
        risky_operation()
    except ValueError as e:
        handle_value_error(e)
    except TypeError:
        handle_type_error()
    else:
        handle_success()
    finally:
        cleanup()
    """
    def __init__(self, ast节点, 所属节点模型管理器, 上级节点=None, 节点位置=None):
        super().__init__(ast节点, 所属节点模型管理器, "异常处理", 节点位置=节点位置, 上级节点=上级节点)

        # 设置日志级别
        if self.调试模式:
            日志记录器.setLevel(logging.DEBUG)
            日志记录器.debug(f"{self.__class__.__name__}调试模式已开启")
        else:
            日志记录器.setLevel(logging.ERROR)

        # 创建异常处理输出接口
        self.添加接口到节点("控制流", "输出", 接口名称="处理结果", 必须连接=True)

        # 处理try块
        for 索引, 语句 in enumerate(self._ast节点.body):
            语句节点 = 节点模型匹配器(语句, self.所属节点模型管理器)
            if 语句节点:
                起始接口 = 语句节点.添加接口到节点("控制流", "输出", 接口名称="语句", 必须连接=True)
                结束接口 = self.添加接口到节点("控制流", "输入", 接口名称=f"try_{索引}", 必须连接=True)
                起始接口.接口创建连接线模型(结束接口, self)

        # 处理except处理器
        for 索引, 处理器 in enumerate(self._ast节点.handlers):
            # 处理异常类型
            if 处理器.type:
                类型节点 = 节点模型匹配器(处理器.type, self.所属节点模型管理器)
                if 类型节点:
                    起始接口 = 类型节点.添加接口到节点("数据流", "输出", 接口名称="类型", 必须连接=True)
                    结束接口 = self.添加接口到节点("数据流", "输入", 接口名称=f"异常类型_{索引}", 必须连接=True)
                    起始接口.接口创建连接线模型(结束接口, self)

            # 处理异常名称
            if 处理器.name:
                名称节点 = 节点模型匹配器(ast.Name(id=处理器.name, ctx=ast.Store()), self.所属节点模型管理器)
                if 名称节点:
                    起始接口 = 名称节点.添加接口到节点("数据流", "输出", 接口名称="名称", 必须连接=True)
                    结束接口 = self.添加接口到节点("数据流", "输入", 接口名称=f"异常名称_{索引}", 必须连接=True)
                    起始接口.接口创建连接线模型(结束接口, self)

            # 处理处理器体
            for 语句索引, 语句 in enumerate(处理器.body):
                语句节点 = 节点模型匹配器(语句, self.所属节点模型管理器)
                if 语句节点:
                    起始接口 = 语句节点.添加接口到节点("控制流", "输出", 接口名称="语句", 必须连接=True)
                    结束接口 = self.添加接口到节点("控制流", "输入", 接口名称=f"except_{索引}_{语句索引}", 必须连接=True)
                    起始接口.接口创建连接线模型(结束接口, self)

        # 处理else块
        if self._ast节点.orelse:
            for 索引, 语句 in enumerate(self._ast节点.orelse):
                语句节点 = 节点模型匹配器(语句, self.所属节点模型管理器)
                if 语句节点:
                    起始接口 = 语句节点.添加接口到节点("控制流", "输出", 接口名称="语句", 必须连接=True)
                    结束接口 = self.添加接口到节点("控制流", "输入", 接口名称=f"else_{索引}", 必须连接=True)
                    起始接口.接口创建连接线模型(结束接口, self)

        # 处理finally块
        if self._ast节点.finalbody:
            for 索引, 语句 in enumerate(self._ast节点.finalbody):
                语句节点 = 节点模型匹配器(语句, self.所属节点模型管理器)
                if 语句节点:
                    起始接口 = 语句节点.添加接口到节点("控制流", "输出", 接口名称="语句", 必须连接=True)
                    结束接口 = self.添加接口到节点("控制流", "输入", 接口名称=f"finally_{索引}", 必须连接=True)
                    起始接口.接口创建连接线模型(结束接口, self)

@注册节点图形项(ast.Try)
class Try异常处理图形节点(带组件带布局的节点图形项):
    """
    Try异常处理的图形表示
    """
    def __init__(self, 节点模型, 父容器节点图形项管理器, 父项=None):
        super().__init__(节点模型, 父容器节点图形项管理器, 父项)

@注册节点模型(ast.Raise)
class Raise异常抛出节点模型(ast节点基础模型):
    """
    Raise异常抛出节点模型，用于表示Python中的raise语句
    例如：
    raise ValueError("Invalid value")
    raise Exception from cause
    """
    def __init__(self, ast节点, 所属节点模型管理器, 上级节点=None, 节点位置=None):
        super().__init__(ast节点, 所属节点模型管理器, "异常抛出", 节点位置=节点位置, 上级节点=上级节点)

        # 设置日志级别
        if self.调试模式:
            日志记录器.setLevel(logging.DEBUG)
            日志记录器.debug(f"{self.__class__.__name__}调试模式已开启")
        else:
            日志记录器.setLevel(logging.ERROR)

        # 创建异常抛出输出接口
        self.添加接口到节点("控制流", "输出", 接口名称="异常", 必须连接=True)

        # 处理异常表达式
        if self._ast节点.exc:
            异常节点 = 节点模型匹配器(self._ast节点.exc, self.所属节点模型管理器)
            if 异常节点:
                起始接口 = 异常节点.添加接口到节点("数据流", "输出", 接口名称="值", 必须连接=True)
                结束接口 = self.添加接口到节点("数据流", "输入", 接口名称="异常值", 必须连接=True)
                起始接口.接口创建连接线模型(结束接口, self)

        # 处理cause表达式
        if self._ast节点.cause:
            原因节点 = 节点模型匹配器(self._ast节点.cause, self.所属节点模型管理器)
            if 原因节点:
                起始接口 = 原因节点.添加接口到节点("数据流", "输出", 接口名称="值", 必须连接=True)
                结束接口 = self.添加接口到节点("数据流", "输入", 接口名称="原因", 必须连接=True)
                起始接口.接口创建连接线模型(结束接口, self)

